/**
 * #info
 *
 *@author   wuwg
 *@createTime   2018/03/20
 *@updateTime   2018/04/12
 *@description  switch  component  开关插件
 */
/**
 * #item
 *
 * @type        aty-switch
 * @cn          开关
 * @nameprop   label
 * @menu        表单
 * @stPlugin    true
 * @stContainer false
 * @mixins      [./components/mixins/form-item-props.js]
 */
import config from '../../../config/config.js'

// mixins
import formItem from '../form-item/form-item.js'
// prefix
const prefixCls = config.prefix + '-switch'
// module
const module = {
  name: config.prefix + '-switch',
  mixins: [formItem],
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    /**
     * #property
     *
     * @name    value
     * @cn      是否选中
     * @group   控制
     * @type    boolean
     * @value  false
     * @description 该switch是否选中
     */
    checked: {
      type: Boolean,
      default: false
    },
    /**
     * #property
     *
     * @name    labelOn
     * @cn      开状态文本
     * @group   状态文本
     * @type    string,number,boolean
     * @description 该switch选中时的状态文本
     */
    labelOn: {
      type: [String, Number, Boolean],
      default: ''
    },
    /**
     * #property
     *
     * @name    labelOff
     * @cn      关状态文本
     * @group   状态文本
     * @type    string,number,boolean
     * @description 该switch未选中时的状态文本
     */
    labelOff: {
      type: [String, Number, Boolean],
      default: ''
    },
  },
  data () {
    return {
      currentChecked: this.checked
    }
  },
  computed: {
    wrapStyles() {
      // 'text-align': 'left'
      return Object.assign(this.formItemStyles, {
        position: 'relative'
      })
    },
    wrapClasses() {
      return [
        `${prefixCls}`,
      ]
    },
    formItemWarpClasses() {
      return this.formItemClasses
    },
    innerClasses() {
      return `${prefixCls}-inner`
    },
    inputAttrs: function () {
      return Object.assign({},
        // 默认属性
        {
          type: 'checkbox'
        },
        this.$attrs
      )
    },
    inputListeners: function () {
      const _this = this
      // `Object.assign` 将所有的对象合并为一个新对象
      return Object.assign({},
        // 从父级添加所有的监听器
        this.$listeners,
        // 自定义监听器，或覆写一些监听器的行为
        {
          change: function (event) {
            /**
             * #event
             *
             * @name    change
             * @param   checked   当前的值
             * @param   event   当前事件的event对象
             * @description   值切换改变时触发，值是原生event.target.checked
             * @body
             */
            let v = event.target.checked
            _this.currentChecked = v
            _this.$emit('change', v, event)
            _this.validate()
          }
        }
      )
    }
  },
  methods: {
    // 重置为初始值
    reset () {
      if (this.disabled) {
        return false
      }
      this.$refs.switch.checked = this._originalValue
      this.$emit('change', this._originalValue)
    },
    // 获取待校验value
    getValidateValue: function () {
      return this.currentChecked === undefined ? null : this.currentChecked
    }
  },
  watch: {
    checked(newVal) {
      this.$refs.switch.checked = newVal
      this.currentChecked = newVal
    }
  },
  mounted() {
    this.$refs.switch.checked = this.checked
  },
  created () {
    // 保存初始值，用于reset
    this._originalValue = Artery.deepCopy(this.checked)
  }
}
export default module
